package repository

import (
	"context"
	"server_go/internal/model"
)

type TagRepository interface {
	GetTags(ctx context.Context) ([]*model.Tag, error)
	CreateTag(ctx context.Context, name string) (*model.Tag, error)
	GetTagByID(ctx context.Context, id uint) (*model.Tag, error)
	DeleteTag(ctx context.Context, id uint) error
	GetTagNameByID(ctx context.Context, articleId uint) (string, error)
}

func NewTagRepository(
	repository *Repository,
) TagRepository {
	return &tagRepository{
		Repository: repository,
	}
}

type tagRepository struct {
	*Repository
}

func (r *tagRepository) GetTags(ctx context.Context) ([]*model.Tag, error) {
	var tag []*model.Tag
	err := r.DB(ctx).Find(&tag).Error
	if err != nil {
		return nil, err
	}
	return tag, nil
}
func (r *tagRepository) GetTagByID(ctx context.Context, id uint) (*model.Tag, error) {
	var tag model.Tag
	err := r.DB(ctx).First(&tag, id).Error
	if err != nil {
		return nil, err
	}
	return &tag, nil
}
func (r *tagRepository) CreateTag(ctx context.Context, name string) (*model.Tag, error) {
	var tag model.Tag
	tag.Name = name
	err := r.DB(ctx).Create(&tag).Error
	if err != nil {
		return nil, err
	}
	return &tag, nil
}
func (r *tagRepository) DeleteTag(ctx context.Context, id uint) error {
	return r.DB(ctx).Where("id = ? ", id).Delete(&model.Tag{}).Error
}
func (r *tagRepository) GetTagNameByID(ctx context.Context, tagId uint) (string, error) {
	var name string
	err := r.DB(ctx).Table("tags").Where("id = ?", tagId).Pluck("name", &name).Error
	return name, err
}
